° Le problème
On doit simuler le service d'un restaurant de 50 tables à 2 couverts,sur une durée de 4h. Les groupes de clients sont entre 2 et 6 pertsonnes et arrive toute les 2min. Un groupe doit attendre qu'il y ait assez de place libre,il reste ensuite entre 60 et 120min. Le code doit renvoyer le nombre de client en attente et assis par minutes. Ainsi que le nombre de clients servis au total et la moyenne de clients par table

° Explication de la solution trouvée
Pour cela nous allons avoir besoin de la structure de donnée File car le principe de tête et de queue permet la création d'une file d'attente. De plus nous allons utilisé de la POO afin de créer les groupes de clients. Le programme principal lui est composé d'une boucle permettant de maintenir la simulation à la durée de la soirée. Ainsi que des if qui permette de savoir s'il faut créer un groupe,le placer ou non et si son temps doit être décrémenter. Une fonction de moyenne est aussi nécessaire pour avoir la moyenne de client par table sur la soirée.

° Le code permettant la résolution du problème

from random import randint
from file_optim import *

class GroupeClient :
    """
    création d'un groupe de clients allant 2 à 6 personnes et avec un temps de repas entre 60 et 120 minute
    """
    def __init__(self) :
        self.nb_prsn = randint(2,6)
        self.tps_repas = randint(60,120)

    def __get__(self) :     #récupère le nombre de personne d'unn groupe et leur temps de repas'
        return self.nb_prsn,self.tps_repas

    def passer_tps(self):   #passe le temps de repas du groupe de 1 minute
        self.tps_repas = self.tps_repas - 1

    def __str__(self) :
        return str(self.nb_prsn) +";" + str(self.tps_repas)

def moyenne_client(tab):
    """
    fonction prenant en argument un tableau du nombre de personnes de chaque groupe assis et renvoi la moyenne de ce tableau
    """
    total_client = 0
    for i in range(len(tab)):
        total_client += tab[i]
    return total_client // len(tab)

#----------------------------------------------------------Programme principal--------------------------------------------------

durée_soirée = 240  #règle la durée de la soirée à 240
couverts_dispo = 100  #règle le nombre de couverts total disponible à 100
File_attente = FileOptim() #crée une file d'attente
Liste_assis = []  #crée une liste pour les personnes assises
Compteur_clients = 0 #création d'un compteur du nombre de clients servis
Clients = []  #crée un tableau pour la moyenne de personnes par table
Nb_prsn_assis = 0   #création d'un compteur du nombre de clients assis
Nb_prsn_attente = 0  #création d'un compteur du nombre de clients en attente
Minutes = 1     #crée une variable minutes pour le temps de la soirée

print("Simulation d'une soirée")

while durée_soirée > 0 :    #boucle permettant d'arrêter la simulation à la fin de la soirée

    print("_____________________________________________________________________")
    print(Minutes,"minutes")
    print("-----------")

    if durée_soirée % 2 == 0 :
        Grp = GroupeClient()  #création d'un objet groupe
        File_attente.enfiler(Grp) #objet placer dans la file d'attente
        Nb_prsn_attente += Grp.nb_prsn

    if not File_attente.est_vide() :
        premier_file = File_attente.get_tete()  #récupération de l'objet en tête de la file

        if premier_file.nb_prsn <= couverts_dispo :
            Liste_assis.append(premier_file)    #ajout du premier de la file à la liste des groupes assis
            couverts_dispo -= premier_file.nb_prsn  #suppression du nombre de couverts disponibles en conséquences
            Grp_assis = File_attente.defiler()    #enlève le groupe assis de la file d'attente
            Compteur_clients += premier_file.nb_prsn
            Nb_prsn_assis += premier_file.nb_prsn
            Clients.append(premier_file.nb_prsn)
            Nb_prsn_attente -= Grp_assis.nb_prsn
            if premier_file.nb_prsn % 2 != 0 :
                couverts_dispo -= 1
    for x in Liste_assis :
        x.passer_tps()

        if x.tps_repas <= 0 :
            Liste_assis.pop(Liste_assis.index(x))  #retire le groupe dont le temps de repas a atteint 0 de la liste
            couverts_dispo += x.nb_prsn     #ajout de couverts disponibles en conséquences
            Nb_prsn_assis -= x.nb_prsn

    print("Nombre de clients en attente :",Nb_prsn_attente)  #affichage du nombre de personnes en attente par minutes
    print("Nombre de clients assis :",Nb_prsn_assis)  #affichage du nombre de personnes assises par minutes
    durée_soirée -= 1
    Minutes += 1
print("_____________________________________________________________________")
print("Récapitulatif de la soirée :")
print("----------------------------")
print("Nombres de clients servis :",Compteur_clients)  #affichage du nombre de personnes servis au total
print("Nombre moyen de clients par table :",moyenne_client(Clients)) #affichage du nombre de personnes moyennes par table


			
° Exemples de résultats
< Exemple 1 :
_____________________________
Récapitulatif de la soirée :
----------------------------
Nombres de clients servis : 229
Nombre moyen de clients par table : 3
			
< Exemple 2 :
___________________________________
152 minutes
-----------
Nombre de clients en attente : 133
Nombre de clients assis : 81
___________________________________
153 minutes
-----------
Nombre de clients en attente : 138
Nombre de clients assis : 81
___________________________________
154 minutes
-----------
Nombre de clients en attente : 138
Nombre de clients assis : 75